package top.hkyzf.event;

import com.mojang.logging.LogUtils;
import net.minecraft.client.player.KeyboardInput;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.slf4j.Logger;
import top.hkyzf.util.OneKeyContext;
import top.hkyzf.util.movement.PlayerMovementInput;

/**
 * description: 游戏内时刻相关事件
 * @author zhufeng
 * @date 2022/8/19 17:31
 * @version V1.0
 */
@Mod.EventBusSubscriber(value = Dist.CLIENT)
public class TickEvents {
    /**
     * 获取一个 slf4j 日志记录器
     */
    private static final Logger LOGGER = LogUtils.getLogger();
    /**
     * Mod 所处的上下文环境
     */
    private static final OneKeyContext CONTEXT = OneKeyContext.getInstance();

    /**
     * 每个 tick 都会重新执行
     * @param event 每个 tick 触发的事件
     */
    @SubscribeEvent
    public static void onTickEvent(TickEvent event) {
        // 判断是否已进入游戏
        if (CONTEXT.getMc().player != null && CONTEXT.getMc().level != null) {
            CONTEXT.setInTheWorld(Type.IN);
        } else {
            CONTEXT.setInTheWorld(Type.OUT);
            return;
        }
        // 如果在游戏中判断用户控制还是 AI 控制，并判断使用键盘输入还是 AI 输入
        if (CONTEXT.isInControl()) {
            // 自动挂机中，使用 AI 输入
            if (CONTEXT.getMc().player.input.getClass() != PlayerMovementInput.class) {
                CONTEXT.getMc().player.input = new PlayerMovementInput();
            }
        } else {
            // 其他时间还原为键盘输入
            if (CONTEXT.getMc().player.input == null) {
                // 应该是用户输入还没有初始化完成，不判空会报空指针直接挂掉
                LOGGER.info("用户输入又变成空的了，不是连 IDEA 都提示不为空么？");
            } else if (CONTEXT.getMc().player.input.getClass() == PlayerMovementInput.class) {
                CONTEXT.getMc().player.input = new KeyboardInput(CONTEXT.getMc().options);
            }
        }
    }

    /**
     * 当前是否在游戏中（非主菜单）
     */
    public enum Type {
        /**
         * 可以获取游戏内的变量和状态
         */
        IN,
        /**
         * 无法保证游戏内的变量和状态
         * 有可能在主菜单中
         */
        OUT,
    }
}
